# _*_ coding:utf-8 _*_
# 开发团队: Mavericks
# 开发人员：Maverick·Ming
# 开发IDE： PyCharm
#   项目名：HelloWorld
#   文件名：7.06 文件读取.py
# 开发时间：2021/3/29 12:14

"""读取小文件的方式"""

# 创建文件名变量
# file_name = 'demo.txt'
file_name = 'chinese_poem.txt'

# 打开文件
try:
    # open()打开的文件有两种类型：1.纯文本文件(utf-8编码的文件)；2.二进制文件(图片、mp3、ppt等文件)
    # open()默认以文本本形式打开
    # 如果不指定编码，无法处理其他语言的文本文件，如中文
    # 所以打开文本文件时，一般指定encoding='utf-8'
    with open(file_name, encoding='utf-8') as file_obj:
        # 如果直接调用read()会将文本内容全部读取出来
        # 如果读取大文件，会一次性将内容加载到内存中，容易导致内存溢出
        # 因此对于大型文件，不会直接调用read()

        # 不知道read()如何使用时，可以help()
        # help(file_obj.read)
        # 结果:read(size=-1, /)

        # 读取文件内容
        # content = file_obj.read()
        # read()可以接收一个size作为参数, 决定读取字符的数量
        # content = file_obj.read(-1)  # 默认值为-1，读取文件所有内容
        content = file_obj.read(13)  # 默认值为13，前13个字符
        # content = file_obj.read(13)  # 第二次读取，从上一次读取结束的位置开始继续读取13个
        # 每一次读取都是从上一次读取到的位置开始读取
        # 如果剩余字符数量小于size的长度，直接读取所有的字符

        # 查看读取到的内容
        # print(content, '\n读取字符数len=', len(content))

except FileNotFoundError:
    # print(file_name, '文件未找到')
    print(f'非发现{file_name}文件')

"""
在计算机科学中，内存泄漏是一种资源泄漏。
发生这种情况时，不再需要的内存未被释放，计算机程序以错误的方式管理内存分配。
当对象存储在内存中但不能被运行,代码无法访问时，也可能发生内存泄漏。
内存泄漏的症状类似于许多其他问题，通常它只能由能够访问程序源代码的程序员来诊断。

当计算机程序使用的内存超出所需的量度时，就会发生空间泄漏。(read()操作大文件时就会发生)
与永远不会释放的内存泄漏不同，空间泄漏消耗的内存会释放，但其会比预期的晚。 
因为内存泄漏会在应用程序运行时耗尽可用的系统内存，这种情况通常是软件老化的原因造成的。
"""

"""读取大文件的方式"""

# 创建文件名变量
file_name = 'demo.txt'
# file_name = 'chinese_poem.txt'

# 打开文件
try:
    with open(file_name, encoding='utf-8') as file_obj:
        # 定义一个变量，决定每次读取的长度
        chunk = 20
        # 定义一个变量，累存读取到的文件内容
        file_content = ''
        # 创建一个循环，分多次取出大文件的内容
        while True:
            # 读取长度为chunk的内容
            content = file_obj.read(chunk)
            # 检查是否读取到内容
            if len(content) == 0:
                break
            # 查看并拼接读取到的内容，两种方式：
            print(content, end='')  # 方式一
            file_content += content  # 方式二
except FileNotFoundError:
    # print(file_name, '文件未找到')
    print(f'非发现{file_name}文件')
finally:
    print('\n')
    print(file_content)  # 方式二

# 读取大文件的思想：
# 多次少取
